/*要求：编写一个C函数，将一个字符串全部倒置过来，要求其中句中的单词位置倒置，
但不改变单词内部字母顺序，注意这里的单词个数是不确定的。（若有多个空格，仅保留一个）。

输入样例：
I am from   China

输出样例：
China from am I

输入样例：
I am from China  and what about  you

输出样例：
you about what and China from am I
*/

#include <stdio.h>
#include <string.h>
//定义调用函数
void removeExtraSpaces(char *str) {  
    int i, j, len = strlen(str);  
    for (i = j = 0; i < len; i++) {  
        if (str[i] == ' ') {  
            // 如果当前字符是空格，且前一个字符不是空格，则保留这个空格  
            if (i == 0 || str[i - 1] != ' ') {  
                str[j++] = ' ';  
            }  
        } else {  
            str[j++] = str[i];   //此处需要注意，j++是先用了j的值再进行+1。
        }  
    }  
    // 如果字符串以空格结尾，则删除这个空格  
    if (j > 0 && str[j - 1] == ' ') {  
        j--;  
    }  
    str[j] = '\0'; // 添加字符串结束符  
}  


void reverseWords(char *str)  //定义调用函数
{
    // 反转整个字符串
    str[strcspn(str, "\n") ] = 0; // 此处处理掉换行符，因为fgets会读取换行符，如果此处不处理换行符，下面会将换行符倒置
    int len = strlen(str);  //strlen不包括结尾的'\0'
    int i = 0;
    int j = len - 1; //此处是为了j正好对应字符串对应最后一个字符，不信你试试
    while (i < j) {    //此处开始正式反转字符串
        char temp = str[i];
        str[i] = str[j];
        str[j] = temp;
        i++;
        j--;
    }
    removeExtraSpaces(str);

    // 上述程序虽然完成了字符串的反转，但是每个单词也是反的，接下来开始反转每个单词
    i = 0;
    while (i < len) {
        if (str[i] == ' ') {
            i++;
            continue;
        }
        int j = i;
        while (j < len && str[j] != ' ') {
            j++;
        }
        int start = i;
        int end = j - 1;
        while (start < end) {
            char temp = str[start];
            str[start] = str[end];
            str[end] = temp;
            start++;
            end--;
        }
        i = j;
    }
}

int main()
{
    char str[1000];
    fgets(str, 1000, stdin);
    reverseWords(str);
    printf("%s", str);
    return 0;
}